// TOWN SCRIPT
//    Town 10: Proving Grounds - Tenth Level

// This is the special encounter script for this town.
// The states INIT_STATE, EXIT_STATE, and START_STATE have
// meanings that are described in the documenation. States you write
// yourself should be numbered from 10-100.

// flags:
// 10, 3 - 10, 8 = monsters generated values

begintownscript;

variables;

short i, j, tt, lvl, mlvl, x, y, choice;

body;

beginstate INIT_STATE;
	turn_off_training(1);
	set_crime_tolerance(1);

	// reset flags
	set_flag(10, 0, 0);
	set_flag(10, 1, 0);
	set_flag(10, 2, 0);
	set_flag(10, 10, 0);
	set_flag(10, 11, 0);
	set_flag(10, 12, 0);
	set_flag(10, 13, 0);
	set_flag(10, 14, 0);
	set_flag(10, 15, 0);
break;

beginstate EXIT_STATE;
// Always called when the town is left.
break;

beginstate START_STATE;
break;

beginstate 10;
	if (get_flag(10, 2) == 0) {
		set_flag(10, 2, 1);
		reset_dialog();
		add_dialog_str(0, "A sign on the door reads:", 0);
		add_dialog_str(1, "Lair of the arch-mage Werdna", 0);
		add_dialog_str(2, "The Wizard is", 30);
		if (get_flag(50, 1) == 0) {
			add_dialog_str(3, "* IN *", 50);
		}
		else {
			add_dialog_str(3, "* OUT * ", 40);
		}
		add_dialog_choice(0, "OK");
		choice = run_dialog(0);
	}

	// balance werdna and friends (first time outside door)...
	// (may bring the creature levels down)
	// Werdna starts at lvl 45, vamp lords start at lvl 40
	if (get_flag(10, 9) == 0) {
		set_flag(10, 9, 1);
		i = 0;
		lvl = 0;
		while (i < 4) {
			if (char_ok(i) == TRUE) {
				j = get_level(i);
				if (j > lvl) {
					lvl = j;
				}
			}
			i = i + 1;
		}

		if (lvl > 55) {
			tt = (lvl - 45) / 3;
			mlvl = 45 + get_ran(1, 0, tt);
		}
		else {
			if (lvl > 45)
				mlvl = 48;
			else
				mlvl = lvl;
		}
		if (mlvl > 100) {
			mlvl = 100;
		}
		set_level(6, mlvl); // werdna

		if (lvl > 55) {
			tt = (lvl - 40) / 3;
			mlvl = 40 + get_ran(1, 0, tt);
		}
		else {
			if (lvl > 40)
				mlvl = 43;
			else
				mlvl = lvl - 1;
		}
		if (mlvl > 100) {
			mlvl = 100;
		}
		set_level(7, mlvl); // friends (vampire lords)
		set_level(8, mlvl);
	}
break;

beginstate 11;
	message_dialog("The teleporter crackles and hums casting an eerie light.", "You see a faint image of the castle within it's shimmering glow.");
break;

beginstate 12;
	block_entry(1);
	reset_dialog_preset_options(3);
	choice = run_dialog(0);
	if (choice == 2) {
		i = 0;
		while (i < 4) {
			if (char_ok(i) == TRUE) {
				put_sparkles_on_char(i, 0, 12);
			}
			i = i + 1;
		}
		run_animation_sound(10);
		move_to_new_town(0, 24, 19);
	}
break;

beginstate 13;
	block_entry(1);
	reset_dialog();
	add_dialog_str(0, "The floor here crackles with static electricity.", 0);
	add_dialog_choice(0, "Stay off");
	add_dialog_choice(1, "Step on");
	choice = run_dialog(0);
	if (choice == 2) {
		play_sound(-10);
		move_to_new_town(1, 4, 42);
	}
break;

beginstate 14;
	message_dialog("The teleporter crackles and hums casting an eerie light.", "You see a faint image of another corridor within it's shimmering glow.");
break;

beginstate 15;
	block_entry(1);
	reset_dialog_preset_options(3);
	choice = run_dialog(0);
	if (choice == 2) {
		teleport_party(x, y, 0);
	}
break;

beginstate 16;
	x = 7;
	y = 16;
	set_state_continue(15);
break;

beginstate 17;
	x = 11;
	y = 6;
	set_state_continue(15);
break;

beginstate 18;
	x = 31;
	y = 10;
	set_state_continue(15);
break;

beginstate 19;
	x = 13;
	y = 23;
	set_state_continue(15);
break;

beginstate 20;
	x = 40;
	y = 26;
	set_state_continue(15);
break;

beginstate 21;
	x = 27;
	y = 33;
	set_state_continue(15);
break;

beginstate 22;
	if (get_flag(10, 0) == 0) {
		set_flag(10, 0, 1);
		reset_dialog();
		add_dialog_str(0, "Inscribed in an ornate gold plaque is a message.", 0);
		add_dialog_str(1, "The script is ornate, and blinks in various bright hues:", 0);
		add_dialog_str(2, "Be it known that ye are trespassing on the property of the Arch-Mage Werdna.", 0);
		add_dialog_str(3, "There is no possible way that ye can possibly get through my defenses, let alone defeat me in battle!", 0);
		add_dialog_str(4, "So sure am I of this that I give you this clue: Contra-Dextra Avenue.", 0);
		add_dialog_str(5, "PS - Trebor Sux", 0);
		if (get_flag(50, 1) > 0) {
			add_dialog_str(6, "Underneath, someone placed in big black letters:", 0);
			add_dialog_str(7, "NAY, NAY, NAY - you're dead and you Sux more.", 0);
		}
		add_dialog_choice(0, "OK");
		choice = run_dialog(1);
	}
break;

beginstate 23;
	if ((get_flag(10, 1) == 0) && (get_flag(50, 1) == 0)) {
		set_flag(10, 1, 1);
		reset_dialog();
		add_dialog_str(0, "Suddenly a voice booms out.", 0);
		add_dialog_str(1, "_One group of guardians ye have beaten but many more await ye!_", 0);
		add_dialog_str(2, "_Turn back while you still can, mortals!_", 0);
		add_dialog_choice(0, "OK");
		choice = run_dialog(1);
	}
break;

// generate up to 6 monsters, place in room entering (next 6 states)
beginstate 24;
	if (get_flag(10, 10) == 0) {
		set_flag(10, 10, 1);
		// clear monsters...
		run_scenario_script(25);
		// generate new set
		run_scenario_script(24);
		if (get_flag(10, 3) > 0) {
			place_monster(3, 25, get_flag(10, 3), 0);
		}
		if (get_flag(10, 4) > 0) {
			place_monster(5, 24, get_flag(10, 4), 0);
		}
		if (get_flag(10, 5) > 0) {
			place_monster(7, 25, get_flag(10, 5), 0);
		}
		if (get_flag(10, 6) > 0) {
			place_monster(3, 27, get_flag(10, 6), 0);
		}
		if (get_flag(10, 7) > 0) {
			place_monster(5, 26, get_flag(10, 7), 0);
		}
		if (get_flag(10, 8) > 0) {
			place_monster(7, 27, get_flag(10, 8), 0);
		}
		set_state_continue(30);
	}
break;

beginstate 25;
	if (get_flag(10, 11) == 0) {
		set_flag(10, 11, 1);
		// clear monsters...
		run_scenario_script(25);
		// generate new set
		run_scenario_script(24);
		if (get_flag(10, 3) > 0) {
			place_monster(3, 7, get_flag(10, 3), 0);
		}
		if (get_flag(10, 4) > 0) {
			place_monster(3, 9, get_flag(10, 4), 0);
		}
		if (get_flag(10, 5) > 0) {
			place_monster(4, 6, get_flag(10, 5), 0);
		}
		if (get_flag(10, 6) > 0) {
			place_monster(4, 8, get_flag(10, 6), 0);
		}
		if (get_flag(10, 7) > 0) {
			place_monster(5, 7, get_flag(10, 7), 0);
		}
		if (get_flag(10, 8) > 0) {
			place_monster(5, 9, get_flag(10, 8), 0);
		}
		set_state_continue(30);
	}
break;

beginstate 26;
	if (get_flag(10, 12) == 0) {
		set_flag(10, 12, 1);
		// clear monsters...
		run_scenario_script(25);
		// generate new set
		run_scenario_script(24);
		if (get_flag(10, 3) > 0) {
			place_monster(21, 6, get_flag(10, 3), 0);
		}
		if (get_flag(10, 4) > 0) {
			place_monster(24, 6, get_flag(10, 4), 0);
		}
		if (get_flag(10, 5) > 0) {
			place_monster(26, 6, get_flag(10, 5), 0);
		}
		if (get_flag(10, 6) > 0) {
			place_monster(22, 8, get_flag(10, 6), 0);
		}
		if (get_flag(10, 7) > 0) {
			place_monster(23, 7, get_flag(10, 7), 0);
		}
		if (get_flag(10, 8) > 0) {
			place_monster(25, 8, get_flag(10, 8), 0);
		}
		set_state_continue(30);
	}
break;

beginstate 27;
	if (get_flag(10, 13) == 0) {
		set_flag(10, 13, 1);
		// clear monsters...
		run_scenario_script(25);
		// generate new set
		run_scenario_script(24);
		if (get_flag(10, 3) > 0) {
			place_monster(26, 24, get_flag(10, 3), 0);
		}
		if (get_flag(10, 4) > 0) {
			place_monster(23, 24, get_flag(10, 4), 0);
		}
		if (get_flag(10, 5) > 0) {
			place_monster(21, 24, get_flag(10, 5), 0);
		}
		if (get_flag(10, 6) > 0) {
			place_monster(25, 21, get_flag(10, 6), 0);
		}
		if (get_flag(10, 7) > 0) {
			place_monster(23, 21, get_flag(10, 7), 0);
		}
		if (get_flag(10, 8) > 0) {
			place_monster(19, 20, get_flag(10, 8), 0);
		}
		set_state_continue(30);
	}
break;

beginstate 28;
	if (get_flag(10, 14) == 0) {
		set_flag(10, 14, 1);
		// clear monsters...
		run_scenario_script(25);
		// generate new set
		run_scenario_script(24);
		if (get_flag(10, 3) > 0) {
			place_monster(42, 14, get_flag(10, 3), 0);
		}
		if (get_flag(10, 4) > 0) {
			place_monster(42, 17, get_flag(10, 4), 0);
		}
		if (get_flag(10, 5) > 0) {
			place_monster(42, 20, get_flag(10, 5), 0);
		}
		if (get_flag(10, 6) > 0) {
			place_monster(40, 19, get_flag(10, 6), 0);
		}
		if (get_flag(10, 7) > 0) {
			place_monster(40, 16, get_flag(10, 7), 0);
		}
		if (get_flag(10, 8) > 0) {
			place_monster(39, 15, get_flag(10, 8), 0);
		}
		set_state_continue(30);
	}
break;

beginstate 29;
	if (get_flag(10, 15) == 0) {
		set_flag(10, 15, 1);
		// clear monsters...
		run_scenario_script(25);
		// generate new set
		run_scenario_script(24);
		if (get_flag(10, 3) > 0) {
			place_monster(32, 25, get_flag(10, 3), 0);
		}
		if (get_flag(10, 4) > 0) {
			place_monster(33, 26, get_flag(10, 4), 0);
		}
		if (get_flag(10, 5) > 0) {
			place_monster(33, 23, get_flag(10, 5), 0);
		}
		if (get_flag(10, 6) > 0) {
			place_monster(34, 22, get_flag(10, 6), 0);
		}
		if (get_flag(10, 7) > 0) {
			place_monster(36, 22, get_flag(10, 7), 0);
		}
		if (get_flag(10, 8) > 0) {
			place_monster(35, 24, get_flag(10, 8), 0);
		}
		set_state_continue(30);
	}
break;

// balance them...
//  --- ASSUME 86 through 92 only... ---
beginstate 30;
	// get party max
	i = 0;
	lvl = 0;
	while (i < 4) {
		if (char_ok(i) == TRUE) {
			j = get_level(i);
			if (j > lvl) {
				lvl = j;
			}
		}
		i = i + 1;
	}
	// balance monsters (cur lvl + 0..delta + 2)
	i = 86;
	while (i <= 92) {
		if (char_ok(i) == TRUE) {
			j = get_level(i);
			if (lvl > j) {
				tt = lvl - j;
				// monster level = cur lvl + 0..delta + 2
				if (tt > 10) {
					tt = tt / 3;
					mlvl = j + get_ran(1, 0, tt) + 2;
				}
				else {
					mlvl = j + 2;
				}
				if (mlvl <= 100)
					set_level(i, mlvl);
				else
					set_level(i, 100);
			}
			else {
				// lower the level of the creatures
				if (lvl > 10)
					set_level(i, lvl - 3);
				else
					set_level(i, lvl + 1);
			}
		}
		i = i + 1;
	}
break;
